package com.novatec.mvc.controlador;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.novatec.dao.ClientesDAO;
import com.novatec.dao.ReportesDao;
import com.novatec.mvc.modelo.Cliente;
import com.novatec.mvc.modelo.Movimiento;
import com.novatec.mvc.modelo.SaldoItem;
import com.novatec.mvc.modelo.SolicitudesItem;
import com.novatec.util.Sesion;


@Controller
public class Reportes {
	private Logger log = Logger.getLogger(this.getClass());

	@Autowired
	private ReportesDao reportesDao;
	
	@Autowired
	private ClientesDAO clientesDAO;
	
	@Autowired
	private Sesion sesUsuario;
	
	
	// admin -> consultas -> solicitudes
	@RequestMapping(value="/reportes/listasolicitudes", method=RequestMethod.GET)
	public ModelAndView listaSolicitudes() {
		ModelAndView mav = new ModelAndView("formListaSolicitudes");
		log.debug("lista de solicitudes");
		List<SolicitudesItem> lista = reportesDao.getAllSolicitudes();

		mav.addObject("lista", lista);

		return mav;
	}

	// admin -> consultas -> solicitudes
	@RequestMapping(value="/reportes/listasolicitudes", method=RequestMethod.POST)
	public ModelAndView listaSolicitudesFiltro(@RequestParam("nroorden") String nroOrden,
											   @RequestParam("cliente") String cliente,
			  								   @RequestParam("fechaemision") String fechaEmision,
			  								   @RequestParam("inputestado") long inputEstado) {
		
		ModelAndView mav = new ModelAndView("formListaSolicitudes");
		List<SolicitudesItem> lista = reportesDao.getAllSolicitudesFiltro(nroOrden, cliente, fechaEmision, inputEstado);
		mav.addObject("lista", lista);

		return mav;
	}

	// cliente -> consultas -> movimientos 
	@RequestMapping(value="/reportes/listaSolicitudesCliente", method=RequestMethod.GET)
	public ModelAndView listaSolicitudesCliente() {
		ModelAndView mav = new ModelAndView("formListaSolicitudesCliente");

		String rucdni = Long.toString(clientesDAO.getRucDniForClienteLogueado(Long.toString(sesUsuario.getIdUsuario())));
		log.debug("rucdni: " + rucdni);

		List<SolicitudesItem> lista = reportesDao.getSolicitudesCliente(rucdni);
		mav.addObject("lista", lista);

		return mav;
	}	

	// cliente -> consultas -> movimientos 
	@RequestMapping(value="/reportes/listaSolicitudesCliente", method=RequestMethod.POST)
	public ModelAndView listaSolicitudesClienteFiltro(@RequestParam("nroorden") String nroOrden,
													  @RequestParam("fechaemision") String fechaEmision,
													  @RequestParam("inputestado") long inputEstado) {

		ModelAndView mav = new ModelAndView("formListaSolicitudesCliente");

		List<SolicitudesItem> lista = reportesDao.getSolicitudesClienteFiltro(sesUsuario.getIdUsuario(), nroOrden, fechaEmision, inputEstado);
		mav.addObject("lista", lista);

		return mav;
	}


	@RequestMapping("/reportes/filtroSolicitudes")
	public ModelAndView listaFiltradaSolicitudes(@RequestParam("nroorden") String nroorden, @RequestParam("cliente") String cliente, @RequestParam("fechaemision") String fechaemision, @RequestParam("estado") String estado) {
		ModelAndView mav = new ModelAndView("formListaSolicitudes");

		List<SolicitudesItem> listabase = reportesDao.getAllSolicitudes();
		List<SolicitudesItem> lista = new ArrayList<SolicitudesItem>(); 

		String orden;
		String clie;
		String estad;

		for (int i = 0; i < listabase.size(); i++){
			SolicitudesItem si = listabase.get(i);
			orden = (String.valueOf(si.getnOrden())).substring(0, nroorden.length());
			clie = si.getCliente().substring(0, cliente.length());
			estad = si.getEstado().substring(0, estado.length()).toUpperCase();

			if (orden.equals(nroorden) && orden.length() > 0)
				lista.add(si);
			if (clie.equals(cliente) && !lista.contains(si) && clie.length() > 0)
				lista.add(si);
			if (estad.equals(estado.toUpperCase()) && !lista.contains(si) && estad.length() > 0)
				lista.add(si);
		}

		mav.addObject("lista", lista);

		return mav;
	}

	@RequestMapping("/reportes/pedidos")
	public ModelAndView listaPedidos() {
		ModelAndView mav = new ModelAndView("formListaPedidos");

		List<SolicitudesItem> lista = reportesDao.getAllPedidos();
		//List<SolicitudesItem> lista2 = reportesDao.getAllModelosPorPedido();
		
		mav.addObject("lista", lista);
		//mav.addObject("lista2", lista2);

		return mav;
	}

	@RequestMapping("/reportes/filtroPedidos")
	public ModelAndView listaFiltradaPedidos(@RequestParam("nroorden") String nroorden, @RequestParam("cliente") String nocontrato, @RequestParam("fechaemision") String fechaemision, @RequestParam("estado") String cliente) {
		ModelAndView mav = new ModelAndView("formListaPedidos");

		List<SolicitudesItem> listabase = reportesDao.getAllPedidos();
		List<SolicitudesItem> lista = new ArrayList<SolicitudesItem>(); 

		String orden;
		String contrato;
		String clie;

		for (int i = 0; i < listabase.size(); i++){
			SolicitudesItem si = listabase.get(i);
			orden = (String.valueOf(si.getnOrden())).substring(0, nroorden.length());
			contrato = (String.valueOf(si.getnContrato())).substring(0, nocontrato.length());
			clie = si.getCliente().substring(0, cliente.length()).toUpperCase();

			if (orden.equals(nroorden) && orden.length() > 0)
				lista.add(si);
			if (contrato.equals(nocontrato) && !lista.contains(si) && contrato.length() > 0)
				lista.add(si);
			if (clie.equals(cliente.toUpperCase()) && !lista.contains(si) && clie.length() > 0)
				lista.add(si);
		}

		mav.addObject("lista", lista);

		return mav;
	}

	@RequestMapping("/reportes/devoluciones")
	public ModelAndView listaDevoluciones() {
		ModelAndView mav = new ModelAndView("formListaDevoluciones");

		List<SolicitudesItem> lista = reportesDao.getAllDevoluciones();

		mav.addObject("lista", lista);

		return mav;
	}

	@RequestMapping("/reportes/filtroDevoluciones")
	public ModelAndView listaFiltradaDevoluciones(@RequestParam("nroorden") String nroorden, @RequestParam("cliente") String nocontrato, @RequestParam("fechaemision") String fechaemision, @RequestParam("estado") String cliente) {
		ModelAndView mav = new ModelAndView("formListaDevoluciones");

		List<SolicitudesItem> listabase = reportesDao.getAllDevoluciones();
		List<SolicitudesItem> lista = new ArrayList<SolicitudesItem>(); 

		String orden;
		String contrato;
		String clie;

		for (int i = 0; i < listabase.size(); i++){
			SolicitudesItem si = listabase.get(i);
			orden = (String.valueOf(si.getnOrden())).substring(0, nroorden.length());
			contrato = (String.valueOf(si.getnContrato())).substring(0, nocontrato.length());
			clie = si.getCliente().substring(0, cliente.length()).toUpperCase();

			if (orden.equals(nroorden) && orden.length() > 0)
				lista.add(si);
			if (contrato.equals(nocontrato) && !lista.contains(si) && contrato.length() > 0)
				lista.add(si);
			if (clie.equals(cliente.toUpperCase()) && !lista.contains(si) && clie.length() > 0)
				lista.add(si);
		}

		mav.addObject("lista", lista);

		return mav;
	}

	@RequestMapping("/reportes/saldos")
	public ModelAndView listaSaldos() {
		ModelAndView mav = new ModelAndView("formListaSaldos");

		List<SaldoItem> lista = reportesDao.getAllSaldos();

		mav.addObject("lista", lista);

		return mav;
	}

	//lista de saldos por cliente
	@RequestMapping(value="/reportes/saldosCliente",method=RequestMethod.GET)
	public ModelAndView listaSaldosClienteLogueado(@RequestParam("idcliente") String idCliente) {
		ModelAndView mav = new ModelAndView("formListaSaldosCliente");

		List<SaldoItem> lista = reportesDao.getSaldosCliente(idCliente);

		mav.addObject("lista", lista);

		return mav;
	}
	
	//TODO lista de saldos del cliente logueado
	//@RequestMapping(value="/reportes/saldosClienteLogueado",method=RequestMethod.GET)
	@RequestMapping("/reportes/saldosClienteLogueado")
	public ModelAndView listaSaldosCliente() {
		ModelAndView mav = new ModelAndView("formListaSaldosClienteLogueado");
		String rucdni = Long.toString(clientesDAO.getRucDniForClienteLogueado(Long.toString(sesUsuario.getIdUsuario())));
		log.debug(rucdni);
		List<SaldoItem> lista = reportesDao.getSaldosCliente(rucdni);

		mav.addObject("lista", lista);
		
		return mav;
	}	
	
	@RequestMapping("/reportes/filtroSaldosClienteLogueado")
	public ModelAndView listaFiltradaSaldos(@RequestParam("producto") String producto) {
		ModelAndView mav = new ModelAndView("formListaSaldosClienteLogueado");
		String rucdni = Long.toString(clientesDAO.getRucDniForClienteLogueado(Long.toString(sesUsuario.getIdUsuario())));
		log.debug(rucdni);
		List<SaldoItem> listabase = reportesDao.getSaldosCliente(rucdni);
		List<SaldoItem> lista = new ArrayList<SaldoItem>();

		String product;

		for (int i = 0; i < listabase.size(); i++){
			SaldoItem si = listabase.get(i);
			product = si.getTipo().substring(0, producto.length()).toUpperCase();

			if (product.equals(producto.toUpperCase()) && product.length() > 0)
				lista.add(si);
			
		}

		mav.addObject("lista", lista);

		return mav;
	}
	
	@RequestMapping("/reportes/filtroSaldos")
	public ModelAndView listaFiltradaSaldos(@RequestParam("ruc") String ruc, @RequestParam("contrato") String contrato, @RequestParam("producto") String producto) {
		ModelAndView mav = new ModelAndView("formListaSaldos");

		List<SaldoItem> listabase = reportesDao.getAllSaldos();
		List<SaldoItem> lista = new ArrayList<SaldoItem>();

		String product;
		String contrat;

		for (int i = 0; i < listabase.size(); i++){
			SaldoItem si = listabase.get(i);
			//fvilla 10-04-2012
				//product = si.getTipo().substring(0, producto.length()).toUpperCase();
				product = si.getTipo().toUpperCase();
				//contrat = (String.valueOf(si.getIdcontrato())).substring(0, contrato.length());
				contrat = String.valueOf(si.getIdcontrato());
			//fvilla 10-04-2012
			

			if (product.equals(producto.toUpperCase()) && product.length() > 0)
				lista.add(si);
			if (contrat.equals(contrato) && !lista.contains(si) && contrat.length() > 0)
				lista.add(si);
		}

		mav.addObject("lista", lista);

		return mav;
	}

	@RequestMapping("/reportes/clientes")
	public ModelAndView listaClientes() {
		ModelAndView mav = new ModelAndView("formListaCliente");

		List<Cliente> lista = reportesDao.getAllClientes();

		mav.addObject("lista", lista);

		return mav;
	}

	@RequestMapping("/reportes/filtroCliente")
	public ModelAndView listaFiltradaClientes(@RequestParam("dni-ruc") String dni, @RequestParam("nombre") String nombre) {
		ModelAndView mav = new ModelAndView("formListaCliente");

		List<Cliente> listabase = reportesDao.getAllClientes();
		List<Cliente> lista = new ArrayList<Cliente>();

		String razon;

		for (int i = 0; i < listabase.size(); i++){
			Cliente c = listabase.get(i);
			razon = c.getRazonSocial().substring(0, nombre.length()).toUpperCase();

			if (razon.equals(nombre.toUpperCase()) && razon.length() > 0)
				lista.add(c);
		}

		mav.addObject("lista", lista);

		return mav;
	}

	@RequestMapping("/reportes/movimientos")
	public ModelAndView listaMovimientos() {
		ModelAndView mav = new ModelAndView("formListaMovimientos");

		List<Movimiento> lista = reportesDao.getAllMovimientosCliente();

		mav.addObject("lista", lista);

		return mav;
	}

	//fvilla 10-04-2012 ini

	// adm -> consultas -> movimientos 
	@RequestMapping(value="/reportes/listaSolicitudesClienteid", method=RequestMethod.GET)
	public ModelAndView listaSolicitudesCliente(@RequestParam("idcliente") String idcliente) {
		ModelAndView mav = new ModelAndView("formListaSolicitudesCliente");

		List<SolicitudesItem> lista = reportesDao.getSolicitudesCliente(idcliente);
		mav.addObject("lista", lista);

		return mav;
	}		
	
	//fvilla 10-04-2012 fin	
	
	//fvilla 17-04-2012 ini
	
	//fvilla 17-04-2012 fin
	
}
